package com.my.main.common.utils;

import java.math.BigDecimal;

/**
 * 下面我们来看看BigDecimal的setScale方法
 
	BigDecimal.setScale()方法用于格式化小数点
	 
	表示保留一位小数，默认用四舍五入方式
	setScale(1)
	 
	直接删除多余的小数位，如2.35会变成2.3 
	setScale(1,BigDecimal.ROUND_DOWN)
	 
	进位处理，2.35变成2.4 
	setScale(1,BigDecimal.ROUND_UP)
	 
	四舍五入，2.35变成2.4
	setScale(1,BigDecimal.ROUND_HALF_UP)
	 
	四舍五入，2.35变成2.3，如果是5则向下舍
	setScaler(1,BigDecimal.ROUND_HALF_DOWN)
	 
	
	注意点一
	scale指的是你小数点后的位数。scale()就是BigDecimal类中的方法。如
	BigDecimal b = new BigDecimal("123.456"); 
	b.scale(),返回的就是3
	 
	
	注意点二
	roundingMode是小数的保留模式。它们都是BigDecimal中的常量字段,有很多种，如
	BigDecimal.ROUND_HALF_UP表示的就是4舍5入
	 
	
	注意点三
	pubilc BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)的意思是说：我用一个BigDecimal对象除以divisor后的结果，并且要求这个结果保留有scale个小数位，roundingMode表示的就是保留模式是什么，是四舍五入啊还是其它的
	 
	
	注意点四
	对于一般add、subtract、multiply方法的小数位格式化如下
	BigDecimal mData = new BigDecimal("9.655").setScale(2, BigDecimal.ROUND_HALF_UP);
	System.out.println("mData=" + mData);
	
	 
	原帖地址:
	http://blog.csdn.net/ahwr24/article/details/7048724
	http://blog.csdn.net/zb48857441/article/details/6180958
 * @author Guojh
 * 2016/10/18
 */
public class MathUtil {

	/**
	 * 加法
	 * 
	 * @param a
	 * @param b
	 * @param scal
	 * @return
	 * @throws Exception
	 */
	public static BigDecimal add(Object a,Object b,int scal) throws Exception{
	    BigDecimal add1 = conversionToBigDecimal(a);
	    BigDecimal add2 = conversionToBigDecimal(b);
	    BigDecimal result = add1.add(add2).setScale(scal,BigDecimal.ROUND_HALF_UP);
	    return result;
	}
	 
	/**
	 * 减法
	 * 
	 * @param a
	 * @param b
	 * @param scal
	 * @return
	 * @throws Exception
	 */
	public static BigDecimal subtract(Object a,Object b,int scal) throws Exception{
	    BigDecimal subtract1 = conversionToBigDecimal(a);
	    BigDecimal subtract2 = conversionToBigDecimal(b);
	    BigDecimal result = subtract1.subtract(subtract2).setScale(scal,BigDecimal.ROUND_HALF_UP);
	    return result;
	}

	/**
	 * 乘法
	 * 
	 * @param a
	 * @param b
	 * @param scal
	 * @return
	 * @throws Exception
	 */
	public static BigDecimal multiply(Object a,Object b,int scal) throws Exception{
	    BigDecimal multiply1 = conversionToBigDecimal(a);
	    BigDecimal multiply2 = conversionToBigDecimal(b);
	    BigDecimal result = multiply1.multiply(multiply2).setScale(scal,BigDecimal.ROUND_HALF_UP);
	    return result;
	}
	 
	/**
	 * 除法
	 * 
	 * @param a
	 * @param b
	 * @param scal
	 * @return
	 * @throws Exception
	 */
	public static BigDecimal divide(Object a,Object b,int scal) throws Exception{
	    BigDecimal divide1 = conversionToBigDecimal(a);
	    BigDecimal divide2 = conversionToBigDecimal(b);
	    BigDecimal result = divide1.divide(divide2,scal,BigDecimal.ROUND_HALF_UP);
	    return result;
	}
	
	/**
	 * 类型转换
	 * 
	 * @param obj
	 * @return
	 * @throws Exception
	 */
	public static BigDecimal conversionToBigDecimal(Object obj) throws Exception
	{
		if (null == obj) {
			return new BigDecimal("0");
		}
		
	  if (obj instanceof Double)
	  {
	   return new BigDecimal(obj.toString());
	  }
	  else if (obj instanceof Float)
	  {
	   return new BigDecimal(obj.toString());
	  }
	  else if (obj instanceof Integer)
	  {
	   return new BigDecimal(obj.toString());
	  }
	  else if (obj instanceof Long)
	  {
	   return new BigDecimal(obj.toString());
	  }
	  else if (obj instanceof Byte)
	  {
	   return new BigDecimal(obj.toString());
	  }
	  else if (obj instanceof Short)
	  {
	   return new BigDecimal(obj.toString());
	  }
	  else if (obj instanceof BigDecimal)
	  {
		  return new BigDecimal(obj.toString());
	  }
	  else if (obj instanceof String)
	  {
		  return new BigDecimal(obj.toString());
	  }
	  else
	  {
	   throw new Exception("不能转换");
	  }
	}
}
	 